[문법] PHP코딩팁. include와 return의 특성 :: PHP5의 추가된 사항을 올리는 곳입니다.[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

PHP5의 추가된 사항을 올리는 곳입니다.
[1]
등록일:2007-10-10 23:09:26 (0%)
작성자:
제목:[문법] PHP코딩팁. include와 return의 특성
  
include  된  파일에서  return  을  해서  다음과  같이  값을  받을  수  있다.

test.php
<?php
$ret  =  include  'test2.php';
echo  $ret;
?>

test2.php
<?php
return  'val';  
?>

main  함수(PHP_SELF)에서  return  을  사용하면  exit의  효과가  된다.

또한  return  이후의  구문에서  정의된  함수라도  사용할  수  있다.
<?php
test1();

return;  //  실행은  여기서  종료된다.
function  test1(){
echo  '11111';
}
?>



이번에는  이  특성을  함수가  겹치지  않게  정의하는  용도로  사용해보자.  함수가  겹치지  않으려면  다음과  같은  방법이  있다.

첫번째로는  if  문을  이용한다.
<?php
...
if  (function_exists('~~~'))  {
//  함수정의부
}
...
?>

두번째  방법은  return을  이용하는  것인데  보통  함수파일들을  include해서  사용하는  것을  생각해보면  나름대로  쓸만하다.

test.php
<?php
include  'test2.php';

test1();

function  test1()  {
echo  '1111';
}
?>

test2.php
<?php
if  (function_exists('test1'))  return  false;
function  test1()  {
echo  '2222';
}
?>

이  경우에는  test2.php  의  test1()이  아예  무시된다.  그런데  재미있는  것은  이  경우라도  겹치지  않는  함수에  대해서는  실행이  가능하다는  것이다.  게다가  if  구문  없이  무작정  return  을  해줘도  가능하다!!

test.php
<?php
include  'test2.php';

test1();
test2();

function  test1()  {
echo  '1111';
}
?>

test2.php
<?php
return;
function  test1()  {
echo  '2222';
}
function  test2()  {
echo  '어라?  이건  되네?';
}
?>

저는  주로  함수를  끝머리에서  정의하는데,  이런  식으로  사용한다면  겹치지  않게  정의를  할  수  있을  것  같습니다.  마지막으로  하나더.  그럼  다른  겹치는  함수가  겹치지  않는  함수  다음에  나온다면?

test.php
<?php
include  'test2.php';

test1();
test2();
test3();

function  test1()  {
echo  '1111';
}
function  test3()  {
echo  '내가  먼저  했음';
}
?>

test2.php
<?php
return;
function  test1()  {
echo  '2222';
}
function  test2()  {
echo  '어라?  이건  되네?';
}
function  test3()  {
echo  '얜  또  안돼네..';
}
?>

"내가  먼저  했음"  이  나옵니다.  
  
  
  

    
      거친마루        05-05-29  19:59      
허허  의도적인  특징인지  우연히  생긴  특징인지  모르지만  유용하네요  -_-  버전이  올라가면서  스펙이  바뀌는게  아니라면  당장적용을..  
혹시  return의  이유에  대해  가독성이  떨어질찌  모르니  인클루드  될  파일에는  
<?php  /*  if  function  not  exists  */  return;  
정도로  써주는  센스를  발휘해도  괜찮을꺼같습니다.  :  )    
  
허허  의도적인  특징인지  우연히  생긴  특징인지  모르지만  유용하네요  -_-  버전이  올라가면서  스펙이  바뀌는게  아니라면  당장적용을..
혹시  return의  이유에  대해  가독성이  떨어질찌  모르니  인클루드  될  파일에는
<?php  /*  if  function  not  exists  */  return;
정도로  써주는  센스를  발휘해도  괜찮을꺼같습니다.  :  )  
    
      낭망백수        05-05-30  01:25      
이건좀...  음...  진정한  팁으로  승화시키려면  레퍼런스가  필요할  듯  싶은데...  함수정의에  대해서는  전문가의  고견이  좀  필요할  듯  싶습니다.  꾸벅~!    
  
이건좀...  음...  진정한  팁으로  승화시키려면  레퍼런스가  필요할  듯  싶은데...  함수정의에  대해서는  전문가의  고견이  좀  필요할  듯  싶습니다.  꾸벅~!  
    
      이대규        05-05-30  10:05      
return  문에  대한  것은  명세에  있긴  한데요..  
중복되는  함수명에  대한  처리는  명확하게  안나와있습니다.  
아주  유용하긴  할거  같은데..  좀  불안하군여..  

제  생각에  아마  PHP6  쯤  되면  namespace  개념이  도입되지  않을까  생각하는  중입니다.    
  
return  문에  대한  것은  명세에  있긴  한데요..
중복되는  함수명에  대한  처리는  명확하게  안나와있습니다.
아주  유용하긴  할거  같은데..  좀  불안하군여..

제  생각에  아마  PHP6  쯤  되면  namespace  개념이  도입되지  않을까  생각하는  중입니다.  
    
      낭망백수        05-05-30  11:41      
이대규  //  그런데  namespace  개념이  동적  웹페이지에서  어떤  역할을  할  수  있을지  의문입니다.  함수  정의와  관련된  부분은  뭐  정적(ㅡㅡ;)  인  컴파일  언어에서도  마찬가지  아닌가  하는  생각도  들구요.  꾸벅~!    
  
이대규  //  그런데  namespace  개념이  동적  웹페이지에서  어떤  역할을  할  수  있을지  의문입니다.  함수  정의와  관련된  부분은  뭐  정적(ㅡㅡ;)  인  컴파일  언어에서도  마찬가지  아닌가  하는  생각도  들구요.  꾸벅~!  
    
      이대규        05-05-30  11:57      
제  생각에  namespace는  현대적  프로그래밍  언어가  갖추어야  할  기본  교양이  아닐까  합니다.  

하나의  프로그램이  여러  업체들이  만든  코드가  한데  어울려서  만들어지는  것이  아주  일반적인  상황이니까요.  

php에선  some_  식의  함수/클래스이름으로  해결하고  있는데  좀  구시대적이기도  하고  불편할  때도  많고  해서요..    
  
제  생각에  namespace는  현대적  프로그래밍  언어가  갖추어야  할  기본  교양이  아닐까  합니다.

하나의  프로그램이  여러  업체들이  만든  코드가  한데  어울려서  만들어지는  것이  아주  일반적인  상황이니까요.

php에선  some_  식의  함수/클래스이름으로  해결하고  있는데  좀  구시대적이기도  하고  불편할  때도  많고  해서요..  
    
      캐빈        05-05-30  12:21      
[캐빈]  -  위의  예제중  두번째  방식에  대한  반론  


==  글쓴이의  본문  중  ========================  
test.php  
<?php  
include  \'test2.php\';  

test1();  

function  test1()  {  
        echo  \'1111\';  
}  
?>  

test2.php  
<?php  
if  (function_exists(\'test1\'))  return  false;  
function  test1()  {  
        echo  \'2222\';  
}  
?>  
========================================  



라고  하셨는데  


이  경우는  Fatal  오류가  발생하지  않나요?  (TEST  -  Linux  :  Apache_1.3.33  :  PHP-5.0.3)  

PHP  의  실행  구조상  include  의  return  은  해당  파일의  \'실행\'을  종료하는  것이며  이는  다시  말해  return  다음의  function,  class  도  

메모리에  적재를  하겠다는  말입니다.  

먼저  main  함수가  되는  test.php  의  코드를  읽어  드려  class,  function  등을  메모리에  적재  할  것이며  

그  다음  include  가  된  test2.php  의  class,  function  등을  읽어  들이는데  

이때  위와  같은  코드에서는  test2.php  의  test1()  함수  선언부에서  

이미  정의  된  함수(test1.php  를  먼저  읽어  들였으므로)  라고  Fatal  오류가  날  것입니다.  

이를  방지  하기  위해서  


test2.php  는  
<?PHP  

if  (!function_exists(\'test1\'))    {  
        function  test1()  {  
                echo  \'2222\';  
        }  
}  
?>  

와  같이  행복한고니님이  말씀하신  첫번째  방식으로  RunTime  함수  정의로  처리하여야  옳은  방법이  될것  같습니다.    
  
[캐빈]  -  위의  예제중  두번째  방식에  대한  반론


==  글쓴이의  본문  중  ========================
test.php
<?php
include  \'test2.php\';

test1();

function  test1()  {
        echo  \'1111\';
}
?>

test2.php
<?php
if  (function_exists(\'test1\'))  return  false;
function  test1()  {
        echo  \'2222\';
}
?>
========================================



라고  하셨는데


이  경우는  Fatal  오류가  발생하지  않나요?  (TEST  -  Linux  :  Apache_1.3.33  :  PHP-5.0.3)

PHP  의  실행  구조상  include  의  return  은  해당  파일의  \'실행\'을  종료하는  것이며  이는  다시  말해  return  다음의  function,  class  도  

메모리에  적재를  하겠다는  말입니다.

먼저  main  함수가  되는  test.php  의  코드를  읽어  드려  class,  function  등을  메모리에  적재  할  것이며

그  다음  include  가  된  test2.php  의  class,  function  등을  읽어  들이는데  

이때  위와  같은  코드에서는  test2.php  의  test1()  함수  선언부에서

이미  정의  된  함수(test1.php  를  먼저  읽어  들였으므로)  라고  Fatal  오류가  날  것입니다.

이를  방지  하기  위해서


test2.php  는
<?PHP

if  (!function_exists(\'test1\'))    {
function  test1()  {
        echo  \'2222\';
}
}
?>

와  같이  행복한고니님이  말씀하신  첫번째  방식으로  RunTime  함수  정의로  처리하여야  옳은  방법이  될것  같습니다.  
    
      낭망백수        05-05-30  13:49      
캐빈  //  
!function_exists()  조건下에서  정의하도록  하는  것이  메뉴얼에서도  제시하는  방법이라고  압니다만....  

일단,  PHP4.3.11  에서는  error가  발생하지  않으며,  
(PHP5  의  core가  상당히  변했다고  하더군요.  클래스  및  객체는  완전히  새로  작성되었다고  하구요.)  

test.php  
<?php  
include  \'test2.php\';  

test1();  

function  test1()  {  
        echo  \'1111\';  
}  
?>  

test2.php  
<?php  
if  (function_exists(\'test1\'))  return  false;  
function  test1()  {  
        echo  \'2222\';  
}  
?>  
//  RESULT  :  \"1111\"  

결과는  제가  예상한  것과  딴판입니다.  
제  예상은,  include  문이  파싱  제어와  관련되었으므로  먼저  test2.php  를  파싱하고  
\'2222\'를  출력하는  test1()이  먼저  정의되므로  
test.php  에서  중복정의  parse  error  를  유발한다고  생각했었습니다.  
추측건데,  
파싱과  실행시점이란게  있기는  있는데,  
파싱시점엔  단순히  문자열  토큰을  얻는데  그치고  루틴을  실제로  메모리로  로딩하는  것은  아닌것  같습니다.  

어쨋든  
if  !function_exists()  
define  function(){};  
표현이  올바르다고  생각합니다.  
꾸벅~!    
  
캐빈  //  
!function_exists()  조건下에서  정의하도록  하는  것이  메뉴얼에서도  제시하는  방법이라고  압니다만....

일단,  PHP4.3.11  에서는  error가  발생하지  않으며,
(PHP5  의  core가  상당히  변했다고  하더군요.  클래스  및  객체는  완전히  새로  작성되었다고  하구요.)

test.php
<?php
include  \'test2.php\';

test1();

function  test1()  {
        echo  \'1111\';
}
?>

test2.php
<?php
if  (function_exists(\'test1\'))  return  false;
function  test1()  {
        echo  \'2222\';
}
?>
//  RESULT  :  \"1111\"

결과는  제가  예상한  것과  딴판입니다.
제  예상은,  include  문이  파싱  제어와  관련되었으므로  먼저  test2.php  를  파싱하고
\'2222\'를  출력하는  test1()이  먼저  정의되므로
test.php  에서  중복정의  parse  error  를  유발한다고  생각했었습니다.
추측건데,
파싱과  실행시점이란게  있기는  있는데,
파싱시점엔  단순히  문자열  토큰을  얻는데  그치고  루틴을  실제로  메모리로  로딩하는  것은  아닌것  같습니다.

어쨋든
if  !function_exists()  
define  function(){};
표현이  올바르다고  생각합니다.
꾸벅~!  
    
      낭망백수        05-05-30  13:55      
본문의  마지막  테스트결과는...  

1111어라?  이건  되네?내가  먼저  했음  

입니다.  
코드만  보아서는  어떤  함수가  실제로  정의되는지  모르므로  
마지막  방법은  옳지  않은  방법이라고  생각됩니다.  

꾸벅~!    
  
본문의  마지막  테스트결과는...

1111어라?  이건  되네?내가  먼저  했음

입니다.
코드만  보아서는  어떤  함수가  실제로  정의되는지  모르므로
마지막  방법은  옳지  않은  방법이라고  생각됩니다.

꾸벅~!  
    
      Gloridea        05-05-30  15:09      
PHP  5.0.3  환경에서는  확실히  에러입니다.  :  )  
테스트  환경  :  Fedora  Core2  /  Apache  2.0.51  /  PHP  5.0.3    
  
PHP  5.0.3  환경에서는  확실히  에러입니다.  :  )
테스트  환경  :  Fedora  Core2  /  Apache  2.0.51  /  PHP  5.0.3  
    
      낭망백수        05-05-30  15:35      
PHP5  가  보다  strict  하다는  거군요.  ^^;    
  
PHP5  가  보다  strict  하다는  거군요.  ^^;  
    
      핑크플로이드        05-05-30  20:05      
일단  코드부분을  메모리에  적재하고...  
지역변수는  스택영역에  저장한  다음...  
실행하면서  return  value  값에  대한  스택영역값을  채우고...  
include를  하게  되면  부함수  호출처럼  원래  호출  부분을  벗어나  include  된  파일을  파싱하겠지만...  
include  된  파일의  function  exist  이후  코드는  파싱하지  않는군요...    
  
일단  코드부분을  메모리에  적재하고...
지역변수는  스택영역에  저장한  다음...
실행하면서  return  value  값에  대한  스택영역값을  채우고...
include를  하게  되면  부함수  호출처럼  원래  호출  부분을  벗어나  include  된  파일을  파싱하겠지만...
include  된  파일의  function  exist  이후  코드는  파싱하지  않는군요...  
    
      낭망백수        05-05-31  01:56      
실행시  include를  만나는  시점에서  include된  파일을  파싱한다...  라...  
include..    파싱제어가  아니라  결국  함수라는  것이군요.  꾸벅~!    
  
출처  :  http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=40195&sca=&sfl=wr_subject%7C%7Cwr_content&stx=php5&sop=and&page=5
[본문링크] [문법] PHP코딩팁. include와 return의 특성
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=1086
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.